/*
 * Project Name: tennis
 * $Id:  IBaseService.java 2016-05-14 18:31:58 $
 */

package org.aceor.tennis.service;


import org.aceor.tennis.domain.BaseDomain;
import org.aceor.tennis.common.util.SqlOrder;

import java.util.List;
import java.util.Map;

/**
 * service接口
 * @author lxue
 *
 * 2015年10月4日 下午4:19:00
 */
public interface IBaseService<T extends BaseDomain>{

    /**
     * 增加实体
     * @param entity
     * @return
     */
    public int add(T entity);

    /**
     * 删除实体
     * @param pkID
     * @return
     */
    public int delete(Long pkID);

    /**
     * 按页查询，返回实体list
     * @param conditions 查询限制条件
     * @param offset 偏移量
     * @param rows 每页大小（行数）
     * @return 实体list
     */
    public List<T> queryListByPage(Map<String, Object> conditions,
                                            int offset, int rows);

    /**
     * 按页查询，返回实体list，提供排序
     * @param conditions 查询限制条件
     * @param offset 偏移量
     * @param rows 每页大小（行数）
     * @param orderBy 排序的关键字
     * @param sqlOrder 排序的类型
     * @return 实体list
     */
    public List<T> queryListByPage(Map<String, Object> conditions,
                                            int offset, int rows, String orderBy,
                                            SqlOrder sqlOrder);

    /**
     * 只更新实体非Null的属性值
     * @param entity
     * @return
     */
    public int update(T entity);

    public int insertMap(Map<String, Object> entityPropertyMap);

    public int updateMap(Map<String, Object> entityPropertyMap);

    /**
     * 更新实体所有非主键属性，不论属性值是否为Null
     * @param entity
     * @return
     */
    public int updateNull(T entity);

    /**
     * 按主键删除
     * @param pkID
     * @return
     */
    public int deleteById(Long pkID);

    /**
     * 按多条件删除
     * @param conditions
     * @return
     */
    public int deleteByCondition(Map<String, Object> conditions);

    /**
     * 按单一key-value条件删除
     * @param name
     * @param value
     * @return
     */
    public int deleteByProperty(String name, Object value);

    /**
     * 按主键获取
     * @param pkID
     * @return
     */
    public T fetch(Long pkID);

    /**
     * 按key-value条件查询一条记录
     * @param propertyName 数据库列名
     * @param propertyValue 值
     * @return
     */
    public T findOne(String propertyName, Object propertyValue);

    /**
     * 按key-value条件查询一条记录
     * @param propertyName 数据库列名
     * @param propertyValue 值
     * @return
     */
    public List<T> findList(String propertyName, Object propertyValue);

    /**
     * 按key-value条件查询一条记录
     * @param propertyName 数据库列名
     * @param propertyValue 值
     * @param orderBy 排序字段
     * @param sqlOrder 排序类型
     * @return
     */
    public List<T> findList(String propertyName, Object propertyValue,
                                     String orderBy, SqlOrder sqlOrder);

    public List<T> findAll();

    public List<T> findAll(String orderBy, SqlOrder sqlOrder);

    public List<T> like(Map<String, Object> paramMap);

    public List<T> like(Map<String, Object> paramMap,
                                 String orderBy, SqlOrder sqlOrder);

    public List<T> queryList(Map<String, Object> paramMap,
                                      String orderBy, SqlOrder sqlOrder);

    public List<T> queryList(Map<String, Object> paramMap);

    public T queryOne(Map<String, Object> paramMap);

    public T queryOne(Map<String, Object> paramMap,
                               String paramString, SqlOrder paramSqlOrder);

    /**
     * 按条件查询记录数
     * @param paramMap
     * @return
     */
    public int count(Map<String, Object> paramMap);

    /**
     * 查询所有记录数
     * @return
     */
    public int countAll();

    public Long selectMaxId();

    public void updateOrSave(T paramT, Long paramLong);

    /**
     * 暂时未实现
     * @param paramString
     * @param paramObject
     * @return
     */
    public T selectOne(String paramString, Object paramObject);

    /**
     * 暂时未实现
     * @param paramString
     * @param paramObject
     * @return
     */
    public List<T> selectList(String paramString, Object paramObject);

}

